#include "uhm/common.hxx"
#include "uhm/util.hxx"

using namespace uhm;

#define N 1
typedef Map_< ID_Node_<N> > Map;
typedef Map_< ID_Node_H_<N> > HMap;

int main (int argc, char **argv) {

  {
    Map::_Id_ nd;

    nd.set_id(0, 10); Map::Entry_ entry_a( nd, 2 );
    nd.set_id(0, 20); Map::Entry_ entry_b( nd, 4 );


    std::cout << entry_a << " " << entry_b << " < " << (entry_a < entry_b) << std::endl;
    exchange<Map::Entry_>(entry_a,entry_b);
    std::cout << entry_a << " " << entry_b << " < " << (entry_a < entry_b) << std::endl;

    std::cout << "Entry Test done\n";
  }

  {
    Map::_Id_ nd;
    Map A(3), B(5);

    A.push_begin();

    nd.set_id(0, 6); A.push(nd);
    nd.set_id(0, 0); A.push(nd);
    nd.set_id(0, 5); A.push(nd);
    nd.set_id(0, 4); A.push(nd);
    
    A.push_end();

    B.push_begin();

    nd.set_id(0, 6); B.push(nd);
    nd.set_id(0, 5); B.push(nd);
    nd.set_id(0, 1); B.push(nd);
    nd.set_id(0, 3); B.push(nd);
    nd.set_id(0, 0); B.push(nd);

    B.push_end();

    std::cout << A << std::endl;
    std::cout << B << std::endl;

    std::cout << "Map pushing Test done \n";

    Mapper_<Map::_Id_ > M(&A, &B);
    M.relate();
    
    std::cout << M;

    std::cout << "Mapper Test done \n";
  }

  {
    HMap::_Id_ nd;
    nd.set_id(0, 100); nd.set_dof(3); HMap::Entry_ entry_a( nd, 2 );
    nd.set_id(0, 200); nd.set_dof(5); HMap::Entry_ entry_b( nd, 10 );


    std::cout << entry_a << " " << entry_b << " < " << (entry_a < entry_b) << std::endl;
    exchange<HMap::Entry_>(entry_a,entry_b);
    std::cout << entry_a << " " << entry_b << " < " << (entry_a < entry_b) << std::endl;

    std::cout << "H Entry Test done\n";
  }

  {
    HMap::_Id_ nd;
    HMap A(3), B(5);

    A.push_begin();

    nd.set_id(0, 6); nd.set_dof(3); A.push(nd);
    nd.set_id(0, 0); nd.set_dof(2); A.push(nd);
    nd.set_id(0, 5); nd.set_dof(1); A.push(nd);
    
    A.push_end();

    B.push_begin();

    nd.set_id(0, 6); nd.set_dof(3); B.push(nd);
    nd.set_id(0, 5); nd.set_dof(1); B.push(nd);
    nd.set_id(0, 1); nd.set_dof(6); B.push(nd);
    nd.set_id(0, 3); nd.set_dof(2); B.push(nd);
    nd.set_id(0, 0); nd.set_dof(2); B.push(nd);

    B.push_end();

    std::cout << A << std::endl;
    std::cout << B << std::endl;

    std::cout << "Map pushing Test done \n";

    Mapper_<HMap::_Id_ > M(&A, &B);
    M.relate();
    
    std::cout << M;

    std::cout << "Mapper Test done \n";
  }

  return true;
}


